<?php

/**
 * sfGuardUser actions.
 *
 * @package    suap
 * @subpackage sfGuardUser
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class sfGuardUserActions extends sfActions
{
    /*-----------------------
     * executeShow()
     *-----------------------
     *   Show estandar, etc. Pero no muestra
     * los que tienen el flag admin. En realidad todo este modulo
     * no deja editar usuarios admin. 
     */

  public function executeShow(sfWebRequest $request)
  {
    $this->sf_guard_user = Doctrine_Core::getTable('sfGuardUser')->find(array($request->getParameter('id')));

    if ($this->sf_guard_user->getIsSuperAdmin()){
        $this->getUser()->setFlash('error','No se puede ver ese usuario');
        suapUtils::auditar('Intento de ver superusuario', $this->sf_guard_user,
                            $this->sf_guard_user->getId(),false,true);
        $this->redirect('sfGuardUser/index');
    } else {
       $idUsuario = $this->sf_guard_user->getId();
       if ($this->getUser()->getLaboratorio()->tieneUsuario($idUsuario)){
           
            $this->forward404Unless($this->sf_guard_user);

                        // query de grupos a los que pertenece
            $this->gruposP = Doctrine_Core::getTable('sfGuardGroup')
              ->createQuery('gr')
              ->from('sfGuardGroup gr')
              ->leftJoin('gr.Users us')
              ->where('us.id = ?',$this->sf_guard_user->getId())
              ->execute();      

            
           
                            // query de permisos que posee
            $this->permisosP = Doctrine_Core::getTable('sfGuardPermission')
              ->createQuery('pr')
              ->from('sfGuardPermission pr')
              ->leftJoin('pr.Users us')
              ->where('us.id = ?',$this->sf_guard_user->getId())
              ->andWhere('pr.name like "prestador%"')      
              ->execute();      

                        // query de todos los permisos
            $this->permisosT = Doctrine_Core::getTable('sfGuardPermission')
              ->createQuery('pr')
              ->from('sfGuardPermission pr')                    
              ->where('pr.name like "prestador%"')      
              ->andWhere('pr.id NOT IN (
                    SELECT guard.id
                    FROM sfGuardPermission guard
                    LEFT JOIN guard.Users us 
                    WHERE us.id = ?
                )', $this->sf_guard_user->getId())

              ->execute();    
            
            
       } else{
        $this->getUser()->setFlash('error', 'Usted no puede editar ese usuario');
        suapUtils::auditar('Se intenta editar usuario que no pertenece al laboratorio',
                $this->sf_guard_user, $this->sf_guard_user->getId(),true, true);
        $this->redirect('integranteLab/index');
           
       }
           
    }
  }

  
    /*-----------------------
     * executeEdit()
     *-----------------------
     *   Solo deja editar el usuario propio
     */

  public function executeEdit(sfWebRequest $request)
  {
    $this->forward404Unless($sf_guard_user = Doctrine_Core::getTable('sfGuardUser')->find(array($request->getParameter('id'))), sprintf('Object sf_guard_user does not exist (%s).', $request->getParameter('id')));
    
    $idUsuario = $sf_guard_user->getId();
    if ($idUsuario == $this->getUser()->getId()){


        if ($sf_guard_user->getIsSuperAdmin()){
            $this->getUser()->setFlash('error','No se puede editar ese usuario');
            suapUtils::auditar('Intento de ver superusuario', $sf_guard_user,
                                $sf_guard_user->getId(),false,true);
            $this->redirect('sfGuardUser/index');
        }

        $this->form = new sfGuardUserSUAPForm($sf_guard_user);
    } else {
        $this->getUser()->setFlash('error', 'Usted no puede editar ese usuario');
        suapUtils::auditar('Se intenta editar usuario que no es propio',
                $sf_guard_user, $sf_guard_user->getId(),true, true);
        $this->redirect('integranteLab/index');
    }
  }

  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($sf_guard_user = Doctrine_Core::getTable('sfGuardUser')->find(array($request->getParameter('id'))), sprintf('Object sf_guard_user does not exist (%s).', $request->getParameter('id')));
    $this->form = new sfGuardUserSUAPForm($sf_guard_user);

    $this->processForm($request, $this->form);


    $this->setTemplate('edit');
  }

  

    /*-----------------------
     * executeAddPermiso()
     *-----------------------
     *   Toma userId y permiId como parámetros y los linkea
     * previo controlar que sea usuario del laboratorio y que
     * el permiso sea solo de tipo prestador
     * 
     */
  
  public function executeAddPermiso(sfWebRequest $request)
  {
    $this->forward404Unless($sf_guard_user = Doctrine_Core::getTable('sfGuardUser')->find(array($request->getParameter('userId'))), sprintf('Object sf_guard_user does not exist (%s).', $request->getParameter('userId')));
    $this->forward404Unless($sf_guard_permission = Doctrine_Core::getTable('sfGuardPermission')->find(array($request->getParameter('permId'))), sprintf('Object sf_guard_permission does not exist (%s).', $request->getParameter('permId')));
        
    $idUsuario = $sf_guard_user->getId();
    
        // Se fija que sea un usuario del laboratorio
    if ($this->getUser()->getLaboratorio()->tieneUsuario($idUsuario)){

                //Se fija que el permiso sea de prestador        
        if(substr($sf_guard_permission->getName(),0,9) == 'prestador' ){
                    //Si esta todo bien, realiza el unlink                
            $sf_guard_user->link('Permissions', $sf_guard_permission->getId()); 
            $sf_guard_user->save();
            $this->getUser()->setFlash('notice','El usuario ahora tiene el nuevo permiso');
            $this->redirect('sfGuardUser/show?id='.$sf_guard_user->getId());
        } else {
            $this->getUser()->setFlash('error', 'La operación no es posible');
            suapUtils::auditar('Se intenta editar usuario que no es propio',
                    $sf_guard_user, $sf_guard_user->getId(),true, true);
            $this->redirect('integranteLab/index');
        }
    } else {
        $this->getUser()->setFlash('error', 'Usted no puede editar ese usuario');
        suapUtils::auditar('Se intenta editar usuario que no es propio',
                $sf_guard_user, $sf_guard_user->getId(),true, true);
        $this->redirect('integranteLab/index');
        
    }    

  }
  
    /*-----------------------
     * executeRemovePermiso()
     *-----------------------
     *   Toma userId y permId como parámetros los des-linkea
     * previo controlar que no estén linkeados y demas.
     * 
     */
  
  public function executeRemovePermiso(sfWebRequest $request)
  {

    $this->forward404Unless($sf_guard_user = Doctrine_Core::getTable('sfGuardUser')->find(array($request->getParameter('userId'))), sprintf('Object sf_guard_user does not exist (%s).', $request->getParameter('userId')));
    $this->forward404Unless($sf_guard_permission = Doctrine_Core::getTable('sfGuardPermission')->find(array($request->getParameter('permId'))), sprintf('Object sf_guard_permission does not exist (%s).', $request->getParameter('permId')));
    
    $idUsuario = $sf_guard_user->getId();
    
            // Se fija que sea un usuario del laboratorio
    if ($this->getUser()->getLaboratorio()->tieneUsuario($idUsuario)){
                //Se fija que el permiso sea de prestador
        if(substr($sf_guard_permission->getName(),0,9) == 'prestador' ){
                    //Si esta todo bien, realiza el unlink
            $sf_guard_user->unlink('Permissions', $sf_guard_permission->getId()); 
            $sf_guard_user->save();
            $this->getUser()->setFlash('notice','El usuario ahora no tiene ese permiso');
            $this->redirect('sfGuardUser/show?id='.$sf_guard_user->getId());
        } else {
            $this->getUser()->setFlash('error', 'La operación no es posible');
            suapUtils::auditar('Se intenta editar usuario que no es propio',
                    $sf_guard_user, $sf_guard_user->getId(),true, true);
            $this->redirect('integranteLab/index');
        }
    
    } else {
        $this->getUser()->setFlash('error', 'Usted no puede editar ese usuario');
        suapUtils::auditar('Se intenta editar usuario que no es propio',
                $sf_guard_user, $sf_guard_user->getId(),true, true);
        $this->redirect('integranteLab/index');
        
    }    
    

  }
  
  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $sf_guard_user = $form->save();
      $this->getUser()->setFlash('timedNotice','Los cambios fueron guardados');
      $this->redirect('sfGuardUser/edit?id='.$sf_guard_user->getId());
    } else {
        $this->getUser()->setFlash('error','Controle la información ingresada');
    }
  }
}
